--[[
--1.参数列表
-- 1.1优惠券id
local voucherId=ARGV[1]
-- 1.2.用户id
local userId=ARGV[2]

--2.数据key
--2.1.库存key
local stockKey= 'seckill:stock:'..voucherId
--2.2.订单key
local orderKey= 'seckill:order:'..voucherId

--3脚本业务
-- 3.1.判断库存是否充足 get stockKey
local stock=redis.call('get',stockKey)
if (not stock or tonumber(stockKey) <=0) then
    --库存不足,返回1
    return 1
   end
--3.2.判断用户是否下单
if (redis.call('sismember', orderKey, userId)==1) then
    --3.3.存在，说明是重复下单, 返回2
    return 2
end
--3.4.扣减库存 incrby stockKey-1
redis.call('incrby',stockKey,-1)
--3.5.下单(保存用户)
redis.call('sadd', orderKey, userId)
return 0
]]

-- 1. 参数
local voucherId = ARGV[1]
local userId = ARGV[2]
-- 1.3.订单id
local  orderId = ARGV[3]

-- 2. Key 定义（建议加冒号分隔）
local stockKey = 'seckill:stock:' .. voucherId
local orderKey = 'seckill:order:' .. voucherId

-- 3.1 检查库存是否存在且大于 0
local stockStr = redis.call('GET', stockKey)
if not stockStr then
    -- 库存 key 不存在，视为库存不足
    return 1
end

local stock = tonumber(stockStr)
if not stock or stock <= 0 then
    return 1
end

-- 3.2 检查是否已下单
if redis.call('SISMEMBER', orderKey, userId) == 1 then
    return 2
end

-- 3.3 扣库存 + 下单
redis.call('INCRBY', stockKey, -1)
redis.call('SADD', orderKey, userId)
--3.6. 发送消息到队列当中 XADD stream.orders * k1 v1 k2 v2
redis.call('xadd','stream.orders','*','userId',userId,'voucherId',voucherId,'id',orderId)

return 0